package org.example.design.template.template;

import org.example.design.template.utils.ExcelStyle;
import org.example.design.template.utils.IExcelExportUtil;
import org.example.util.FileUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.List;

/**
 * @author huangshen
 * @version 0
 * @description ExcelExportBuilder
 */
public abstract class BaseExcelExportTemplate {
    private static final String CELL = "cell";
    /**
     * 最大行数
     */
    protected Integer maxRowNum = 65535;
    /**
     * 当前总行数
     */
    protected Integer totalRowNum = 0;
    /**
     * Excel标题
     */
    protected String excelTitle;
    /**
     * 导出路径
     */
    protected String exportAddress;
    /**
     * 导出工具类
     */
    protected IExcelExportUtil exportUtil;
    /**
     * 导出对象
     */
    protected Class<?> exportBean;
    /**
     * 导出数据集合
     */
    protected List<?> beanList;
    /**
     * 导出对象的get方法集合
     */
    protected List<Method> getMethodList;
    /**
     * 列名
     */
    protected List<String> columnNameList;
    /**
     * 是否使用新样式
     */
    protected boolean isReSetStyle;

    public <E> BaseExcelExportTemplate init(String exportAddress, Class<E> exportBean, List<E> beanList, boolean isReSetStyle) {
        this.exportBean = exportBean;
        this.exportAddress = exportAddress;
        this.beanList = beanList;
        this.isReSetStyle = isReSetStyle;
        return this;
    }

    /**
     * 初始化
     */
    public abstract BaseExcelExportTemplate prepared();

    public final void initExport() {
        exportUtil.initExcel();
    }

    /**
     * 设置标题
     */
    public final void setTitle() {
        exportUtil.setTitle(excelTitle);
        totalRowNum ++;
    }

    /**
     * 设置数据
     */
    public abstract void setData();

    /**
     * 设置样式
     */
    public final void setCellStyle() {
        exportUtil.setCellStyle(CELL);
    }

    /**
     * 设置列名
     */
    public final void setColName() {
        exportUtil.setColName(columnNameList);
        totalRowNum ++;
    }

    public final void export(OutputStream outputStream) {
        exportUtil.createExcel(outputStream);
    }

    /**
     * 自定义Excel样式
     * @param excelStyle 样式
     * @return this
     */
    public BaseExcelExportTemplate reSetStyle(ExcelStyle excelStyle) {
        exportUtil.setStyleValue(excelStyle);
        return this;
    }

    public final void exportExcel() {
        File file = new File(exportAddress);
        FileUtils.fileExits(file);
        try (OutputStream outputStream = new FileOutputStream(file)) {
            // 初始化poi工具类
            initExport();
            // 设置标题
            setTitle();
            // 设置列名
            setColName();
            // 设置样式
            setCellStyle();
            // 设置参数
            setData();
            // 创建Excel
            export(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
